package com.ld.hpfs.common.utils;

import java.security.MessageDigest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.UUID;

import org.apache.log4j.Logger;


public final class Tools {
	
	private static final Logger log = Logger.getLogger(Tools.class); 
	
	/**
     * 系统中常用的几种日期格式化字符串
     */
    // 不带时间的日期，如生日
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    
    public static final String PATTERN_DATE_FACEBOOK = "MM/dd/yyyy";
    // 带时间的日期，如创建时间、修改时间等
    public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    // 带时区、时间的日期，ODM中要求保存时区
    public static final String PATTERN_DATETIME_TIMEZONE = "yyyy-MM-dd HH:mm:ss Z";

    // 年月日期
    public static final String PATTERN_DATE_YEAR_MOUNTH = "yyyy-MM";
	
	/**
	 * 检测字符串是否不为空(null,"","null")
	 * @param s
	 * @return 不为空则返回true，否则返回false
	 */
	public static boolean notEmpty(String s){
		return s!=null && !"".equals(s) && !"null".equals(s);
	}
	
	/**
	 * 检测字符串是否为空(null,"","null")
	 * @param s
	 * @return 为空则返回true，不否则返回false
	 */
	public static boolean isEmpty(Object s){
		return s==null || "".equals(s) || "null".equals(s);
	}
	
	/**
	 * 字符串转换为字符串数组
	 * @param str 字符串
	 * @param splitRegex 分隔符
	 * @return
	 */
	public static String[] str2StrArray(String str,String splitRegex){
		if(isEmpty(str)){
			return null;
		}
		return str.split(splitRegex);
	}
	
	/**
	 * 用默认的分隔符(,)将字符串转换为字符串数组
	 * @param str	字符串
	 * @return
	 */
	public static String[] str2StrArray(String str){
		return str2StrArray(str,",\\s*");
	}
	
	/**
	 * 按照yyyy-MM-dd HH:mm:ss的格式，日期转字符串
	 * @param date
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String date2Str(Date date){
		return date2Str(date,"yyyy-MM-dd HH:mm:ss");
	}
	
	/**
	 * 按照yyyy-MM-dd HH:mm:ss的格式，字符串转日期
	 * @param date
	 * @return
	 */
	public static Date str2Date(String date){
		if(notEmpty(date)){
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			try {
				return sdf.parse(date);
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				log.error(e.getMessage());
			}
			return new Date();
		}else{
			return null;
		}
	}
	
	/**
	 * 按照参数format的格式，日期转字符串
	 * @param date
	 * @param format
	 * @return
	 */
	public static String date2Str(Date date,String format){
		if(date!=null){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}else{
			return "";
		}
	}
	
	 /**
     * 返回经MD5加密后的字符串
     *
     * @param str 字符串
     * @return 加密后的字符串
     */
    public static String getMD5Str(String str) {
        MessageDigest messageDigest;
        StringBuffer md5StrBuff = new StringBuffer();
        try {
            messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.reset();
            messageDigest.update(str.getBytes("UTF-8"));
            for (byte aByteArray : messageDigest.digest()) {
                if (Integer.toHexString(0xFF & aByteArray).length() == 1)
                    md5StrBuff.append("0").append(Integer.toHexString(0xFF & aByteArray));
                else
                    md5StrBuff.append(Integer.toHexString(0xFF & aByteArray));
            }
        } catch (Exception ignored) {
        }
        return md5StrBuff.toString().toUpperCase();
    }

    /**
     * 格式化日期，返回字符串
     * 使用系统默认时区
     *
     * @param date
     * @param pattern
     * @return 日期格式化字符串
     */
    public static String formateDate(Date date, String pattern) {
        return formateDate(date, pattern, TimeZone.getTimeZone( "GMT-0"));
    }

    /**
     * 格式化日期，返回字符串
     *
     * @param date
     * @param pattern
     * @param zone
     * @return 日期格式化字符串
     */
    public static String formateDate(Date date, String pattern, TimeZone zone) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        format.setTimeZone(zone);
        return format.format(date);
    }

    /**
     * 格式化日期
     *
     * @param date
     * @return 日期格式化字符串
     */
    public static String toDateString(Date date) {
        return formateDate(date, PATTERN_DATE);
    }

    /**
     * 格式化日期时间
     *
     * @param date
     * @return 日期时间格式化字符串
     */
    public static String toDateTimeString(Date date) {
        return formateDate(date, PATTERN_DATETIME);
    }

    /**
     * 格式化日期时间时区
     *
     * @param date
     * @return 日期时间时区格式化字符串
     */
    public static String toDateStingWithTimeZone(Date date) {
        return formateDate(date, PATTERN_DATETIME_TIMEZONE);
    }
    
    /**
     * 将日期字符串转换为日期
     *
     * @param date
     * @param pattern
     * @return 日期对象
     */
    public static Date parseDate(String date, String pattern) {
        try {
        	long mTime = System.currentTimeMillis();
        	Calendar rightNow = Calendar.getInstance();
            int offset = rightNow.getTimeZone().getRawOffset();
            Date d1 = new Date(rightNow.get(Calendar.YEAR),0,rightNow.get(Calendar.DATE));
            Date d2 = new Date(rightNow.get(Calendar.YEAR),rightNow.get(Calendar.MONTH),rightNow.get(Calendar.DATE));
            int sTime = (d1.getTimezoneOffset() - d2.getTimezoneOffset()) * 60000;
            Calendar c = Calendar.getInstance();
            c.setTime(new Date(mTime - offset - sTime));
            return c.getTime();
        } catch (Exception e) {
            return null;
        }
    }

//    public static void main(String[] args) throws Exception {
//		System.out.println(Tools.getDay("08/09/2010"));
//    	
//    	
//		//SendMailUtil.sendMail("11781869@qq.com","aaabbb","pangt","zh-CN");
//	}
    
    /**
     * 将字符串转换为毫秒
     *
     * @param date
     * @return
     */
    public static long parse2Time(String date) {
        Date c = parseDateString(date);
        if (c == null) {
            c = parseDateTimeString(date);
        }
        return c == null ? 0 : c.getTime();
    }

    /**
     * 将日期字符串转换为日期
     *
     * @param date
     * @return 日期对象
     */
    public static Date parseDateString(String date) {
        return parseDate(date, PATTERN_DATE);
    }

    /**
     * 将日期时间字符串转换为日期
     *
     * @param date
     * @return 日期对象
     */
    public static Date parseDateTimeString(String date) {
        return parseDate(date, PATTERN_DATETIME);
    }

    public static String getCurrentDate() {
    	return formateDate(new Date(), "yyyyMMddHHmmss");
    }
    
    public static Date getCurrentDay() {
    	SimpleDateFormat format = new SimpleDateFormat(PATTERN_DATETIME);
        //format.setTimeZone(TimeZone.getTimeZone( "GMT-0"));
        String date = format.format(new Date());
        //return parseDate(date, PATTERN_DATETIME);
        return getDay(date);
    }
    
    public static Date getDay(String day) {
    	try{
    		if(day.length()==10){
    			day = day+" 00:00:00";
    		}
    		return new SimpleDateFormat(PATTERN_DATETIME).parse(day);
    	}catch(Exception e){
    		log.error(e.getMessage(),e);
    	}
        return null;
    }

    /**
     * 将日期时间时区字符串转换为日期
     *
     * @param date
     * @return 日期对象
     */
    public static Date parseDateStingWithTimeZone(String date) {
        return parseDate(date, PATTERN_DATETIME_TIMEZONE);
    }


    /**
     * 将年月字符串转换为日期
     *
     * @param date
     * @return 日期对象
     */
    public static Date parseYearMonthDateSting(String date) {
        return parseDate(date, PATTERN_DATE_YEAR_MOUNTH);
    }

    public static String getPropertyValue(String key){
    	return Const.PROPERTIES.containsKey(key)? Const.PROPERTIES.getProperty(key):"";
    }
    
    public static String RandomUUID(){
    	return UUID.randomUUID().toString();  
    }

    
    public static String getNowDate(){
        String temp_str="";
        Date dt = new Date();
        //最后的aa表示“上午”或“下午”    HH表示24小时制    如果换成hh表示12小时制
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        temp_str=sdf.format(dt);
        return temp_str;
    }
    
    public static long getdate(Date d1, Date d2) {
    	   long i = -1;
    	   long l = d2.getTime() - d1.getTime();
    	   i = l / (1000 * 60);
    	   return i;
    }
}
